package main

import (
	"fmt"
	"time"
)

// 流程控制: if/switch/select/for/range, goto/break/continue

// switch 分支表达式可以是任意类型，不限于常量。可省略 break，默认自动终止。
// select 会随机执行一个可运行的case（必须是通信操作，发送或接收）。如果没有case可运行，它将阻塞，直到有case可运行
// for init; condition; post {}
// for condition {}
// for {}
// for key, value := range someMap { }, 对slice/map/数组/字符串等进行迭代循环

func main() {
	// select的典型用法

}

// 1. 超时判断
var resChan = make(chan int)

func testRequestTimeout() {
	select {
	case data := <-resChan:
		fmt.Println(data)
	case <-time.After(time.Second * 3):
		fmt.Println("request timeout")
	}
}

// 2. 退出信号
var shouldQuit = make(chan struct{})

func testQuit() {
	// 主线程中
	{
		// loop
	}

	// ...out of the loop
	select {
	case <-shouldQuit:
		//cleanUp()
		return
	default:
	}
	//...
}

// 再另外一个协程中，如果遇到非法操作或不可处理的错误，就像shouldQuit发送数据，通知程序停止运行
// close(shouldQuit)

// 3. 判断channel是否阻塞
func testChannel() {
	ch := make(chan int, 5)
	data := 0
	select {
	case ch <- data:
	default:
		// 做相应操作，比如丢弃data等
	}
}
